package org.qiuer.func;

import org.qiuer.ast.expression.IExpression;
import org.qiuer.exception.IException;
import org.qiuer.run.Context;
import org.qiuer.run.FunctionRegistrar;

import java.lang.reflect.ParameterizedType;
import java.util.List;

public abstract class AMemberFunction<T> implements IFunction {
  //通过属性可以调用。如 list.length
  protected boolean propertyCall = false;

  /**
   * 如果定义为成员函数，会注册到某个类型上。如通过 list1.size()的方式才能访问到。
   * 此种类型自身对象也是参数，但是不用显式放到参数上。
   * @return
   */
  public Object run(T member, Context context, List<IExpression> arguments)  throws IException{
    return this.run(member, context, FunctionRegistrar.prepareParams(context, arguments));
  }

  protected abstract Object run(T member, Context context, Object... args)  throws IException;

  /**
   * 获取泛型T的类。
   * @return
   */
  public Class getMemberClass(){
    return (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  }

  public boolean isPropertyCall() {
    return propertyCall;
  }
}
